package co.com.bean.pacientes;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.PacientesDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.PacientesFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartPaciente;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class PacientesBean
 */
@Stateless(mappedName = "ejb/PacientesBean")
public class PacientesBean implements PacientesBeanLocal{
	
		private PacientesFacadeLocal facade;

		public PacientesBean() {
			facade = DelegateContextEJB.getPacientesFacadeLocal();
		}

		@Override
		public ResponseJson insertarPacientes(PacientesDTO pacientesDTO) {

			ResponseJson response = new ResponseJson(); 
			try {
				facade.create(Mapper.mapperDtoToSmartPaciente(pacientesDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente almacenado.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente almacenado.");
			} catch (Throwable e) {
				System.err.println("Error insertando el Paciente -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el Paciente.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}

			return response ;
		}

		@Override
		public List<PacientesDTO> consultarAllPacientes(){
			List<PacientesDTO> Paciente = new ArrayList<PacientesDTO>();
			for (SmartPaciente entity : facade.findAll()) {
				if(entity.getSmFhretiro() == null){
					Paciente.add(Mapper.mapperSmartPacientes_PacientesDTO(entity));
				}
			}

			return Paciente;
		}

		@Override
		public PacientesDTO consultarPacientesId(PacientesDTO pacientesDTO) {
			PacientesDTO Paciente = new PacientesDTO();
			SmartPaciente entity  = facade.find(pacientesDTO.getScpacientes());
			if(entity != null && entity.getSmFhretiro() == null){
				Paciente = Mapper.mapperSmartPacientes_PacientesDTO(entity);
			}
			return Paciente;
		}

		@Override
		public ResponseJson editPacientes(PacientesDTO pacientesDTO){
			ResponseJson response = new ResponseJson(); 
			try {
				pacientesDTO.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartPaciente(pacientesDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente editado.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente editado.");
			} catch (Throwable e) {
				System.err.println("Error editando el Paciente -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el Paciente.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}

			return response ;
		}

		@Override
		public ResponseJson removePacientes(PacientesDTO pacientesDTO, boolean logic) {
			ResponseJson response = new ResponseJson(); 
			if(logic){
				try {
					pacientesDTO.setFhretiro(new Date());
					pacientesDTO.setFhmodificacion(new Date());
					facade.edit(Mapper.mapperDtoToSmartPaciente(pacientesDTO));
					response.setCodigo(Constantes.StatusResponse.OK.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente inactivado");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente inactivado.");
				} catch (Throwable e) {
					System.err.println("Error editando el Paciente -> " + e.getMessage());
					response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el Paciente.");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
				}
			}else{
				try {
					facade.remove(Mapper.mapperDtoToSmartPaciente(pacientesDTO));
					response.setCodigo(Constantes.StatusResponse.OK.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente eliminado");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Paciente eliminado.");
				} catch (Throwable e) {
					System.err.println("Error eliminando el Paciente -> " + e.getMessage());
					response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
					response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el Paciente.");
					response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
				}
			}
			return response ;
		}
}
